/**
******************************************************************************
  * 文件名称: BLDCMotor.hpp
  * 作    者: DoubaoAssistant
  * 版    本: V1.0
  * 日    期: 2025-04-26
  * 说    明: 基于STM32F103的无刷电机驱动类（六步换相）
  ******************************************************************************
  */

#ifndef BLDCMOTOR_HPP
#define BLDCMOTOR_HPP

#include "stm32f1xx_hal.h"
// 电机换向状态表
enum class CommutationStep {
    STEP_1 = 1, // A+ B-
    STEP_2 = 2, // A+ C-
    STEP_3 = 3, // C+ B-
    STEP_4 = 4, // C+ A-
    STEP_5 = 5, // B+ A-
    STEP_6 = 6 // B+ C-
};

enum MotorDirection {
    FORWARD = 1,
    REVERSE = -1
};


class BLDCMotor {
public:


    // 获取单例实例的静态方法
    static BLDCMotor& getInstance();

    // 构造函数 - 传入定时器和GPIO配置
    BLDCMotor(TIM_HandleTypeDef *timHandle,
              uint32_t ch1, uint32_t ch2, uint32_t ch3);

    // 初始化电机驱动
    bool init();

    bool startPWM();

    //更新数据
    void updateStep(uint32_t step);

    // 启动电机
    void start();

    // 停止电机
    void stop();

    // 设置电机转速
    void setSpeed(uint16_t speed);

    // 更新电机状态（根据位置信号换相）
    void update();

    // 执行换相
    void executeCommutation(CommutationStep step);

    CommutationStep getCommutationStep(uint8_t stepIndex) {
        // 确保输入值在有效范围内（0-5）
        if (stepIndex > 5) {
            stepIndex = 0; // 处理超出范围的输入，默认返回STEP_1
        }

        // 使用静态数组进行映射，避免重复的switch语句
        static const CommutationStep stepMap[6] = {
            CommutationStep::STEP_1,
            CommutationStep::STEP_2,
            CommutationStep::STEP_3,
            CommutationStep::STEP_4,
            CommutationStep::STEP_5,
            CommutationStep::STEP_6
        };

        return stepMap[stepIndex];
    }

    void openLoopStart() ;

    /**
     * 
     * @param dir 
     */
    void setDirection(MotorDirection dir);;

private:
    TIM_HandleTypeDef *htim; // 定时器句柄
    uint32_t pwmChannel1; // PWM通道1
    uint32_t pwmChannel2; // PWM通道2
    uint32_t pwmChannel3; // PWM通道3
    uint32_t positionStep; // 指向位置信号的指针

    CommutationStep currentStep; // 当前换向步骤
    uint16_t motorSpeed; // 电机转速
    bool isRunning; // 电机运行状态

    // 配置定时器
    bool configureTimer();

    // 配置GPIO
    void configureGPIO();

    static BLDCMotor* instance;

    MotorDirection motorDirection = FORWARD;

};

#endif // BLDCMOTOR_HPP
